/*
 * Copyright 2009 Brook Smith brook.smith@paradise.net.nz.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package org.javagenerate.generator.script.gen;

import java.util.HashSet;
import java.util.Set;

import org.javagenerate.generator.NamingUtils;
import org.javagenerate.generator.script.BasePatternGenerator;
import org.javagenerate.generator.script.ClassDef;
import org.javagenerate.generator.script.GenBeanDefinition;
import org.javagenerate.generator.script.InterfaceDef;
import org.javagenerate.generator.script.PatternRef;

public class DtoInterfaceDef extends InterfaceDef {

	public DtoInterfaceDef(String classname, String patternName) {
		super(classname, patternName);
		getImports().add("java.io.Serializable");
	}

	@Override
	public String getExtends() {
		return "Serializable";
	}

	private Set<String> dependacies = new HashSet<String>();
	
	@Override
	public void addBeanDefiniation(GenBeanDefinition beanDefinition) {
		if (Character.isLowerCase(beanDefinition.getType().charAt(0))) {
			// denotes that this is a Bean based on this pattern, why else would
			// it be lower case?
			String baseName = NamingUtils.upperFirst(beanDefinition.getType());
			GenBeanDefinition thisDef = new GenBeanDefinition(beanDefinition.getName(), baseName + "Type", beanDefinition.getOptions());
			String ts = getTypeStatement();
			String appendTs = baseName + "Type extends " + baseName + "Def";
			if (ts == null || ts.length() == 0) {
				setTypeStatement(appendTs);
			} else {
				if (!ts.contains(appendTs)) {
					setTypeStatement(ts + ", " + appendTs);
				}
			}
			// <AddressType extends AddressDef>
			super.addBeanDefiniation(thisDef);
			dependacies.add(beanDefinition.getType());
		} else {
			super.addBeanDefiniation(beanDefinition);
		}
	}

	@Override
	public void preWrite() {
		super.preWrite();
		for (String dependacy : dependacies) {
			BasePatternGenerator generator = PatternRef.getBasePatternGenerator(dependacy);
			ClassDef classDef = generator.getClass("interface");
			getImports().add(classDef.getPackageName() +"."+ classDef.getClassName());
		}
	}

}
